package com.hbisdt.cet.sample.producer;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.apache.rocketmq.spring.support.RocketMQHeaders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;

/**
 * RocketMQ消息生产者
 * @author : 教学案例
 * @version : 1.0
 * @date : 2025-04-29 15:52
 */
@Service
public class RocketMQProducer {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    /**
     * 发送消息到指定的RocketMQ主题。
     * 该函数使用RocketMQ模板将消息发送到指定的主题，并在控制台输出已发送的消息内容。
     *
     * @param topic 消息要发送到的RocketMQ主题名称。
     * @param message 要发送的消息内容。
     */
    public void sendMessage(String topic, String message){
        System.out.println("Producer 发送消息: " + message);
        rocketMQTemplate.convertAndSend(topic, message);
    }

    /**
     * 发送消息到指定的RocketMQ主题和标签。
     *
     * @param topic   消息的主题，用于指定消息的类别或目的地。
     * @param tag     消息的标签，用于进一步细分主题下的消息类型。
     * @param message 要发送的消息内容。
     */
    public void sendMessage(String topic, String tag, String message) {
        System.out.println("Producer 向topic为【" + topic + "】,tag为【" + tag + "】发送消息: " + message);
        rocketMQTemplate.convertAndSend(topic + ":" + tag, message);
    }

    /**
     * 发送消息到指定的RocketMQ主题和标签。
     * @param topic   RocketMQ的主题名称，消息将被发送到该主题。
     * @param tag     RocketMQ的标签名称，用于进一步分类主题中的消息。
     * @param key     消息的键，用于标识消息的唯一性，便于追踪或去重
     * @param payload 消息内容。
     */
    public void sendMessage(String topic, String tag, String key, String payload) {
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            // 构建 JSON 消息，包含 payload 和 headers（包括消息键）
            ObjectNode headers = objectMapper.createObjectNode()
                    .put(RocketMQHeaders.KEYS, key);
            ObjectNode messageNode = objectMapper.createObjectNode()
                    .put("payload", payload)
                    .set("headers", headers);

            // 序列化为 JSON 字符串
            String jsonMessage = objectMapper.writeValueAsString(messageNode);

            // 构建 RocketMQ 消息，设置消息键
            Message<String> message = MessageBuilder
                    .withPayload(jsonMessage)
                    .setHeader(RocketMQHeaders.KEYS, key)
                    .build();
            System.out.println("Producer 发送消息: key=" + key + ", payload=" + payload);
            // 发送消息到指定 topic 和 tag
            rocketMQTemplate.send(topic + ":" + tag, message);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
